#ifndef MANAGER_FILE_H
#define MANAGER_FILE_H

#include "eventcommand.h"
#include "data_record.h"

/**
 * @brief   描述 管理文件记录，持续罗盘
 *
 * @author  HC(202206728@any3.com)
 * @date    2023-12-01
 */
typedef struct EventFile_t
{
    TriggerEventInfo trig;
    std::map<std::string, std::shared_ptr<DataRecord>> fileHandle;

} EventFile_t;

//缓存BA692(老铁众测上云事件)的文件信息，等待收到commit信号后发事件信息
typedef struct BA692File_t
{
    TriggerEventInfo trig;
    std::map<string, string> filePaths;
} BA692File_t;


namespace DcAdr
{
    class ManagerFile : public EventCommand
    {
    public:
        static ManagerFile &getInstance();
        /**
         * @brief   描述 打开文件据路
         * @param   pieceData   前多少秒数据
         * @param   trigger     trigger信息
         */
        void openFile(std::map<std::string, std::vector<ProtoData>> &pieceData, const TriggerEventInfo &trigger);

        /**
         * @brief   描述 关闭文件
         * @param   trigger     trigger信息
         */
        void closeFile(const TriggerEventInfo &trigger);

        /**
         * @brief   描述 续写数据
         * @param   data        数据
         */
        void writeFile(const ProtoData &data);

        void CheckBA692CommitEnd();
        void SendBA692Info();
        
    private:
        ManagerFile(/* args */);
        ~ManagerFile();

        void openFilePrivate(const std::map<std::string, std::vector<ProtoData>> &pieceData, const TriggerEventInfo &trigger);
        void closeFilePrivate(const TriggerEventInfo &trigger);
        void writeFilePrivate(const ProtoData &data);
        void updateCollectTopicSet();

        //封装事件信息上云
        void packageEventMessage(const std::map<std::string, std::string> &filePaths, const TriggerEventInfo &trigger);
        // bool convertDesensFiletype(const std::string &fileName, std::string &desensFileName);

        ///管理图片、视频、中间变量3个文件
        //用来记录文件，做持续缓存,事件ID和文件句柄，//第二个map<文件类型（图片、视频、中间变量）,文件句柄>
        std::map<std::string, EventFile_t> m_eventFileAll;
        // 用来快速判断消息是否需要落盘，每次m_eventFileAll变动key都需要更新
        std::unordered_set<std::string> m_collectTopicSet;

        std::vector<BA692File_t> m_BA692Catch;
    };
}

#endif // !MANAGER_FILE_H